package com.example.demo_mysql_mybatisplus.util.api.configTab;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.example.demo_mysql_mybatisplus.util.SqlMapperUtil;
import com.example.demo_mysql_mybatisplus.util.api.configTab.core.ConfigTabEntity;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @description: 配置表通用操作
 *      基础表结构为 ConfigEntity；
 *      架构：
 *          生成历史版本时，当前版本转为历史版本，并copy出最新版本，重新生成id；
 *          业务场景使用到配置时，使用最新配置记录，当配置记录转为历史版本时id不变，不对业务产生影响。
 * @data: 2023/10/8 12:46
 **/
public class ConfigApi{

    private static final String PARENT_ID = "parent_Id";
    private static final String ID = "id";
    private static final String IS_HISTORY = "is_history";
    private static final String STATUS = "status";
    private static final String OPERATE_TIME = "operate_time";

    private BaseMapper mapper;

    public static <T> ConfigApi of(Class<T> entityClass) {
        ConfigApi c = new ConfigApi();
        c.mapper = SqlMapperUtil.getMapper(entityClass);
        return c;
    }

    public BaseMapper getMapper() {
        return mapper;
    }

    /** 新增配置
     * 初始版本号为1，初始状态为编辑中
     * */
    @Transactional(rollbackFor = Exception.class)
    public <T extends ConfigTabEntity> T save(T t){
        t.setVersion(1);
        t.setStatus(0);
        t.setIsHistory(false);
        mapper.insert(t);
        // parentId回显
        t.setParentId(t.getId());
        mapper.updateById(t);
        return t;
    }
    /** 更新配置
     *  旧数据改为历史，改后数据改为新增配置：id重置、状态、版本号增加
     * */
    @Transactional(rollbackFor = Exception.class)
    public <T extends ConfigTabEntity> T update(T t){
        // 更新为历史
        mapper.update(null, Wrappers.update().eq(ID, t.getId()).set(IS_HISTORY,true ) );
        // 插入新配置
        t.setIsHistory(false);
        t.setId(null);
        t.setVersion(t.getVersion()+1);
        t.setStatus(0);
        mapper.insert(t);
        return t;
    }
    /** 修改配置状态 */
    public int editStatus(Long id , Integer status ){
        return mapper.update(null, Wrappers.update().eq(ID, id).set(STATUS,status ) );
    }
    /** 获取所有配置 */
    public <T> List<T> getAllByParentId(Long parentId){
        return mapper.selectList( Wrappers.query().eq(PARENT_ID,parentId) );
    }
    /** 获取历史配置 */
    public <T> List<T> getHistorysByParentId(Long parentId){
        return mapper.selectList( Wrappers.query().eq(PARENT_ID,parentId).eq(IS_HISTORY,true) );
    }
    /** 获取当前配置 */
    public <T> T getCurrentByParentId(Long parentId){
        return (T) mapper.selectOne( Wrappers.query().eq(PARENT_ID,parentId).eq(IS_HISTORY,false) );
    }
    /** 获取所有当前配置 */
    public <T> List<T> getAllCurrents(){
        return mapper.selectList( Wrappers.query().eq(IS_HISTORY,false).orderByDesc(OPERATE_TIME) );
    }



}
